from django.contrib.auth.models import User, Group
from django.utils.timezone import now

from tickets.models import Ticket, ApprovalStep, ApprovalRecord


class AuditLogger:
    """
    通用审计日志记录类。
    """

    @staticmethod
    def log_approval(ticket, step, group, approved_by, status, comments=None):
        """
        记录审计日志。

        :param ticket: Ticket 对象，关联的工单实例。
        :param step: ApprovalStep 对象，当前审批步骤实例。
        :param group: Group 对象，审批组实例。
        :param approved_by: User 对象，审批人实例。
        :param status: str，审批状态，'approved' 或 'rejected'。
        :param comments: str，审批意见，默认为 None。
        :return: ApprovalRecord 对象，记录的审计日志实例。
        """
        if not isinstance(ticket, Ticket):
            raise ValueError("ticket 参数必须是 Ticket 实例")
        if not isinstance(step, ApprovalStep):
            raise ValueError("step 参数必须是 ApprovalStep 实例")
        if not isinstance(group, Group):
            raise ValueError("group 参数必须是 Group 实例")
        if not isinstance(approved_by, User):
            raise ValueError("approved_by 参数必须是 User 实例")
        if status not in ['approved', 'rejected']:
            raise ValueError("status 参数必须是 'approved' 或 'rejected'")


        # 创建审计日志记录
        record = ApprovalRecord.objects.create(
            ticket=ticket,
            step=step,
            group=group,
            approved_by=approved_by,
            approved_at=now(),
            status=status,
            comments=comments
        )
        return record

    @staticmethod
    def get_ticket_logs(ticket):
        """
        获取指定工单的所有审计日志。

        :param ticket: Ticket 对象，关联的工单实例。
        :return: QuerySet，包含所有相关的审计日志记录。
        """
        if not isinstance(ticket, Ticket):
            raise ValueError("ticket 参数必须是 Ticket 实例")
        return ApprovalRecord.objects.filter(ticket=ticket).order_by('approved_at')

    @staticmethod
    def get_user_logs(user):
        """
        获取指定用户参与的所有审计日志。

        :param user: User 对象，用户实例。
        :return: QuerySet，包含该用户参与的审计日志记录。
        """
        if not isinstance(user, User):
            raise ValueError("user 参数必须是 User 实例")
        return ApprovalRecord.objects.filter(approved_by=user).order_by('approved_at')
